/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package com.google.code.twiddling.core.command.builtin;

import java.io.PrintWriter;

import com.google.code.twiddling.core.command.AbstractCommand;
import com.google.code.twiddling.core.command.ICommand;
import com.google.code.twiddling.core.command.CommandContext;
import com.google.code.twiddling.core.command.Command;
import com.google.code.twiddling.core.io.text.TextObjectFactory;
import com.google.code.twiddling.core.io.text.TextTable;
import com.google.code.twiddling.core.registry.CommandRegistry;
import com.google.code.twiddling.core.util.DocUtil;
import com.google.code.twiddling.core.util.DocUtil.DocModel;

/**
 * @author <a href="mailto:jeff.yuchang@gmail.com">Jeff Yu</a>
 *
 */
@Command(name="help", aliases={"?"}, description="show all availble commands and its short description",
		 usage="help [OPTION]...", example="help -h")
public class HelpCommand extends AbstractCommand {

	/* (non-Javadoc)
	 * @see com.google.code.twiddling.core.command.AbstractCommand#doExecute(com.google.code.twiddling.core.command.CommandContext)
	 */
	@Override
	public void doExecute(CommandContext context) throws Exception {
		PrintWriter out = context.getIO().getOut();

		TextTable myTable = TextObjectFactory.getTable("default");
		myTable.getSchema().setShowHeaders(false);
		myTable.getSchema().setColumnSep("");
		myTable.addColumns(new String[] {"Command", "Description"});
		myTable.setColumnWidth("Command", 10);

		CommandRegistry registry = context.getCommandRegistry();
		for(String key : registry.getCommandNames()) {
			ICommand command = registry.newCommandInstance(key);
			DocModel doc = DocUtil.getDocModel(command.getClass());
			myTable.addRow(new String[] {key, "" + doc.getCommand().description()});
		}
		myTable.print(out);
	}

}
